# Go for循环的3种写法:经典/while/无限循环
在Go语言中,`for`循环是唯一的循环结构,但它可以灵活地实现各种循环需求。本文将详细介绍Go语言中for循环的三种主要写法,帮助你掌握这个强大的控制结构。
## 1. 经典for循环(三表达式循环)
这是最常见的for循环形式,与C/C++、Java等语言中的for循环类似:
```go
for 初始化语句; 条件表达式; 后置语句 {
// 循环体
}
```
**示例**:
```go
for i := 0; i < 5; i++ {
fmt.Println(i)
}
```
**输出**:
```
0
1
2
3
4
```
**特点**:
- 先执行初始化语句(只在循环开始执行一次)
- 每次循环前检查条件表达式,若为false则退出循环
- 每次循环后执行后置语句
**注意事项**:
1. 三个部分都可以省略,但分号不能省略
2. 初始化语句和后置语句可以是多个表达式,用逗号分隔
```go
for i, j := 0, 10; i < j; i, j = i+1, j-1 {
fmt.Println(i, j)
}
```
## 2. while循环(条件循环)
Go语言没有专门的`while`关键字,但可以用for循环实现同样的功能:
```go
for 条件表达式 {
// 循环体
}
```
**示例**:
```go
count := 0
for count < 5 {
fmt.Println(count)
count++
}
```
**输出**:
```
0
1
2
3
4
```
**特点**:
- 只包含一个条件表达式
- 相当于其他语言的while循环
- 常用于不确定循环次数的场景
**注意事项**:
1. 必须在循环体内改变条件变量,否则会导致无限循环
2. 条件表达式可以省略,变成无限循环
3. 可以使用`break`或`return`提前退出循环
## 3. 无限循环(无条件循环)
在Go中,省略所有条件即可创建无限循环:
```go
for {
// 循环体
}
```
**示例**:
```go
count := 0
for {
if count >= 5 {
break
}
fmt.Println(count)
count++
}
```
**输出**:
```
0
1
2
3
4
```
**特点**:
- 没有条件表达式,会一直循环
- 必须通过`break`、`return`或`panic`退出
- 常用于服务器的主循环或需要永久运行的任务
**注意事项**:
1. 无限循环应该有明确的退出条件,否则会成为"死循环"
2. 可以使用`break`退出当前循环,或`continue`跳过本次循环
3. 在无限循环中通常有sleep机制,避免CPU占用过高
## 特殊控制语句
Go语言的for循环还支持以下控制语句:
1. `break` - 立即退出当前循环
2. `continue` - 跳过当前循环的剩余部分,进入下一轮循环
3. `goto` - 跳转到指定的标签(慎用)
**带标签的break示例**:
```go
OuterLoop:
for i := 0; i < 3; i++ {
for j := 0; j < 3; j++ {
if i == 1 && j == 1 {
break OuterLoop
}
fmt.Println(i, j)
}
}
```
## for-range循环(遍历专用)
虽然这不是本文重点,但值得一提的是Go特有的for-range循环,用于遍历数组、切片、字符串、map或通道:
```go
for index, value := range collection {
// 循环体
}
```
**数组遍历示例**:
```go
nums := []int{10, 20, 30}
for i, num := range nums {
fmt.Println(i, num)
}
```
**输出**:
```
0 10
1 20
2 30
```
## 总结
1. **经典for循环**:适用于已知循环次数的情况
2. **while式循环**:适用于条件控制的循环
3. **无限循环**:适用于需要永久运行或不确定循环次数的场景
Go语言通过简洁的for循环语法,实现了各种循环需求,体现了Go设计哲学中的"少即是多"。掌握这几种写法,能够让你在Go开发中游刃有余地处理各种循环场景。
**思考题**:你能用for循环实现一个Go版本的do-while循环吗?欢迎在评论区分享你的答案!